import {patch} from './vdom/patch.js'
import watch from './observe/watch.js'
export function mountComponent(vm,el){
   
    //更新函数，数据变化后会再次调用这个函数
    //作用调用render函数，生成虚拟dom   更新流程跳过了编译出事模板过程
    //_render() 就是新的虚拟dom对象

    callHook(vm,'beforeMounte')   //beforeMounted 生命周期

    let updateComponent=()=>{
        vm._update(vm._render())     //数据更新触发方法  在watcher里触发
    }
    //每个组件都有自己的watch ，true--表示它是一个渲染watch 
    new watch(vm,updateComponent,()=>{},true)

    callHook(vm,'mounted')      //mounted 生命周期
}

export function lifeCycle(vue){
    //往实例上挂载更新的方法
    vue.prototype._update=function(vnode){
        let vm=this
        //开启diff算法 传入旧dom，新dom对象
        let prevnode=vm._vnode
        vm._vnode=vnode
        if(prevnode){
            //数据更新后对比
            vm.$el=patch(prevnode,vnode)
        }else{
            //首次对比
            vm.$el=patch(vm.$el,vnode)
        }
        
    }
}

export function callHook(vm,hook){
    //挂载和合并生命周期
    let handle=vm.$options[hook]
    if(handle){
        if(Array.isArray(handle)){
            for(let life of handle){
                life.call(vm)
            }
        }else{
            handle.call(vm)
        }
        
    }
    
}